Финальный этап (4-7 ноября):

Члены комиссии по присуждению премий Мэра Москвы «Лидеры цифровой трансформации» голосуют по шкале от 0 до 5 баллов с шагом 1 балл согласно следующим критериям:

Описание класса Tfidf_model()

Решили самостоятельно написать быструю векторную реализацию TF-IDF, \ чтобы уложится в требования по скорости работы модели ( < 1 сек. )


Существует несколько методов оценки соответствия документа $D$ из корпуса текстов запросу $Q$ на основе TF-IDF.


Классический метод оценки:

$$score(D,Q)=\sum_{i=1}^{n}\text{TF }(q_i,D)\cdot{\text{IDF }}(q_i),$$

где $Q$ — запрос, состоящий из слов $q_1,...,q_n$,

$\text{TF }(q_i,D) = \frac {qty(q_i,D)}{|D|}$ — частота слова (term frequency) $q_i$ в документе $D$,

$qty(q_i,D)$ — количество слов $q_i$ в документе $D$, a $|D|$ — общее количество слов в этом документе,

$\text{IDF } (q_{i})$ — обратная частота документа (inverse document frequency) для слова $q_{i}$.


Также реализовали ряд методов из семейства BM (best match), а именно - BM25, BM15, BM11, используемые поисковыми системами для упорядочивания документов по их релевантности поисковому запросу. Наиболее распростаненным из них является метод ранжирования BM25, который часто называют «Okapi BM25» по названию поисковой системы Okapi (https://ru.wikipedia.org/wiki/Okapi_BM25).

$$score_{BM25}(D,Q)=\sum_{i=1}^{n}{\text{IDF}}(q_i)\cdot {\frac {3\cdot\text{TF }(q_i,D)}{\text{TF }(q_i,D)+0.5+1.5\cdot {\frac {|D|}{\text{avgdl}}}}},$$$$score_{BM15}(D,Q)=\sum_{i=1}^{n}{\text{IDF}}(q_i)\cdot {\frac {3\cdot\text{TF }(q_i,D)}{\text{TF }(q_i,D)+2}},$$$$score_{BM11}(D,Q)=\sum_{i=1}^{n}{\text{IDF}}(q_i)\cdot {\frac {3\cdot\text{TF }(q_i,D)}{\text{TF }(q_i,D)+2\cdot {\frac {|D|}{\text{avgdl}}}}},$$

где $avgdl$ — средняя длина документа в корпусе.


Классическая формула $\text{IDF } (q_i)$:

$$\text{IDF }(q_i)=\log {\frac {N}{n(q_i)}},$$

где $N$ — общее количество документов в корпусе, а $n(q_i)$ — количество документов, содержащих $q_i$.

Также применяется «сглаженный» вариант этой формулы:

$$\text{IDF}_{smooth}(q_i)=\log {\frac {N-n(q_i)+0.5}{n(q_i)+0.5}}$$

.

Эта формула имеет недостаток — для часто-встречающихся слов значение $\text{IDF}_{smooth}$ отрицательно. Таким образом, при наличии двух почти идентичных документов, в одном из которых есть слово, а в другом — нет, второй может получить завышенную оценку. Устраним недостаток, обнулив отрицательные значения.

Отметим, что в библиотеке sklearn (https://scikit-learn.org/stable/modules/feature_extraction.html#tfidf-term-weighting) используются другие два варианта формулы IDF, которые отличаются от классического и «сглаженного».

$$\text{IDF}_{sklearn}(q_i)=\log {\frac {N}{n(q_i)}+1}$$

,

$$\text{IDF}_{sklearn-smooth}(q_i)=\log {\frac {1+N}{1+n(q_i)}}$$

.

В классе Tfidf_model() мы реализовали все описанные выше варианты.